home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
graphic
/
pcx_c.zip
/
HERC.C
< prev
next >
Wrap
C/C++ Source or Header
|
1988-04-17
|
3KB
|
168 lines
/* HERC.c - Video routines specific to the Hercules board.
*/
#include "lib.h"
#include "vgr.h"
#define REG_INDEX 0x3b4
#define REG_DATA 0x3b5
#define REG_MODE 0x3b8
#define REG_STATUS 0x3ba
#define REG_CONFIG 0x3bf
int herc_mode();
int herc_write_row();
int herc_init();
int herc_set_page();
int herc_clear();
int herc_clr_point();
int herc_set_point();
int herc_xor_point();
int herc_get_point();
int herc_null();
int movmem();
int peekb();
int pokeb();
static int herc_page = 0;
static int (*herc_func[])() =
{ herc_init, herc_clear, herc_set_point, herc_clr_point,
herc_xor_point, herc_get_point,herc_write_row, herc_null,
herc_null, herc_mode, movmem, peekb, pokeb,
herc_set_page, herc_null };
static unsigned char far * far *herc_column[2];
static int herc_null()
{
return ERROR; /* do nothing */
}
int herc_set_page( page )
int page;
{
outportb( REG_MODE, (herc_page = !!page) ? 0x8a : 0x0a );
return OK;
}
int herc_clear()
{
setmem( (herc_page ? BASE_HERC1 : BASE_HERC0), 0x8000, 0 );
return OK;
}
int herc_write_row( row, prow, nbytes )
unsigned int nbytes, row;
char *prow;
{
movmem( prow, herc_column[herc_page][row], nbytes );
return OK;
}
int herc_init()
{
unsigned int i,j;
void *malloc();
VGR_HRES = 720;
VGR_VRES = 348;
VGR_NBPL = 90;
VGR_NCOLORS = 2;
if ( !herc_column[0] )
herc_column[0] = CASTUCFPP malloc( sizeof(uchar far *) * VGR_VRES );
if ( !herc_column[0] )
return ERROR;
if ( !herc_column[1] )
herc_column[1] = CASTUCFPP malloc( sizeof(uchar far *) * VGR_VRES );
if ( !herc_column[1] )
{ allocf( herc_column[0] );
return ERROR;
};
for ( i = 0; i < VGR_VRES; i++ )
{ j = 0x2000 * (i & 0x03) + VGR_NBPL * (i >> 2);
herc_column[0][i] = CASTUCFP BASE_HERC0 + j;
herc_column[1][i] = CASTUCFP BASE_HERC1 + j;
};
movmem( herc_func, vgr_func, sizeof(vgr_func) );
return OK;
}
int herc_set_point( x, y )
unsigned int x, y;
{
herc_column[herc_page][y][x>>3] |= (x >> 3);
}
int herc_clr_point( x, y )
unsigned int x, y;
{
herc_column[herc_page][y][x>>3] &= ~(x >> 3);
}
int herc_get_point( x, y )
unsigned int x, y;
{
return !!(herc_column[herc_page][y][x>>3] & (x >> 3));
}
int herc_xor_point( x, y )
unsigned int x, y;
{
herc_column[herc_page][y][x>>3] ^= (x >> 3);
}
int herc_mode( mode )
int mode;
{
int i;
static char setup[2][12] = {
{ 0x35,0x2d,0x2e,0x07,0x5b,0x02,0x57,0x57,0x02,0x03,0x00,0x00 },
{ 0x61,0x50,0x52,0x0f,0x19,0x06,0x19,0x19,0x02,0x0d,0x0b,0x0c }
};
if ( mode == MODE_TEXT0 )
{ outportb( REG_CONFIG, 0 );
outportb( REG_MODE, 0 );
for ( i=0; i < 12; i++ )
{ outportb( REG_INDEX, i );
outportb( REG_DATA, setup[1][i] );
};
outportb( REG_MODE, 0x28 );
vgr_mode(3); /* the cursor is missing if I don't do this... */
return OK;
};
if ( mode == MODE_APA1 )
{ outportb( REG_CONFIG, 3 );
outportb( REG_MODE, 2 );
for ( i=0; i < 12; i++ )
{ outportb( REG_INDEX, i );
outportb( REG_DATA, setup[0][i] );
};
setmem( BASE_HERC0, 0x8000, 0 );
setmem( BASE_HERC1, 0x8000, 0 );
herc_set_page( 1 );
return OK;
};
return ERROR;
}